iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
佛心分享-IT 人自學之術

C++探險家系列 第 24

Day 24 電影問卷分析系統專題製作

  • 分享至 

  • xImage
  •  
#include <iostream>
#include <fstream>
#include <string>
#define movieNum 10    // 電影數目
using namespace std;
typedef struct rateNode {
    float n;
    struct rateNode *next;
} RATE;
typedef struct node {      // 紀錄電影資料的 struct
    int i;                 // 編號
    string name;           // 電影名稱
    float aveRate;         // 平均分數
    RATE *rate;            // 紀錄評分串列
} MOVIE;

MOVIE movieList[movieNum];
void readDate() {
    ifstream my_read_file("movie_data.txt");  // 開啟檔案
    string name;
    float tmpRate;
    int count = 0;
while (my_read_file >> name) {  // 讀取各部電影的 loop
{
   RATE *tmpNode, *topNode = NULL;
   ovieList[count].i = count;
   movieList[count].name = name;
      while (my_read_file >> tmpRate) {  // 讀取評分的 loop
            tmpNode = new RATE;
            tmpNode->n = tmpRate;
            tmpNode->next = NULL;
            if (topNode == NULL)movieList[count].rate = tmpNode;
            else 
                topNode->next = tmpNode;
            topNode = tmpNode;
        }

        my_read_file.clear();  // 清除上次讀取的錯誤,否則無法繼續讀取
        count++;
    }
    my_read_file.close();
}
void average() {
    float sum;
    int count;
    RATE *tmpNode;

    for (int i = 0; i < movieNum; i++) {  // 讀取各電影資料
        sum = 0;
        count = 0;
        tmpNode = movieList[i].rate;

        while (tmpNode != NULL) {  // 計算平均分
            sum += tmpNode->n;
            count++;
            tmpNode = tmpNode->next;
        }

        movieList[i].aveRate = sum / count;
    }
}

void sort() {
    int i, j;
    MOVIE temp;

    for (i = 0; i < movieNum - 1; i++) {
        for (j = i + 1; j < movieNum; j++) {
            if (movieList[i].aveRate < movieList[j].aveRate) {  // 若較小則交換
                temp = movieList[i];
                movieList[i] = movieList[j];
                movieList[j] = temp;
            }
        }
    }
}

void result() {
    int n;
    cout << "您想查看排名前幾名的發表?(1~" << movieNum << ") ";
    cin >> n;
    cout << "==============================" << endl;
    cout << "電影排行榜前" << n << "名" << endl;
    cout << "==============================" << endl;

    for (int i = 0; i < n; i++) {
        cout << i + 1 << ": " << movieList[i].name << " " << movieList[i].aveRate << "分" << endl;
    }
}

int main() {
    readDate();
    average();
    sort();
    result();
    return 0;
}

分析程式碼:
程式的邏輯是讀取電影資料並計算,接著排序並輸出結果。使用兩個結構 rateNodenode 來儲存電影資訊及其評分,並透過鏈表儲存不定數量的評分。接著,readDate() 從檔案讀取電影名稱和評分,average() 計算每部電影的平均評分,並將結果儲存在結構中。之後,sort() 使用雙重迴圈排序電影,根據平均評分從高到低排列。最後,result() 根據使用者選擇顯示前幾名電影的名稱與平均評分。

最有可能出錯的地方分析:

  1. 檔案讀取錯誤:如果檔案 movie_data.txt 打開失敗,或檔案格式不符合預期,可能會導致資料讀取失敗。尤其是 readDate() 函數中,若檔案內沒有正確的名稱或評分格式,會使得程式無法正確讀取並處理資料。
  2. 鏈結資料結構操作錯誤:在處理評分的鏈結結構時,rateNode 的鏈表處理可能會出錯,例如沒有正確地指向 next 結點,會導致資料無法完全遍歷,或出現空指標錯誤。
  3. 評分的類型轉換:當讀取評分時,如果檔案中的評分不是浮點數格式,會導致類型轉換失敗,while(my_read_file >> tmpRate) 無法進行正確的迴圈處理。
  4. 排序邏輯錯誤:在 sort() 函數中,如果邊界條件處理不當或交換過程中出現錯誤,可能導致排序結果不正確。

!!以上內容是跟著第一次學C++就上手第二版跟著一起實作的!!
今天是製作小專題實作的第一天,程式碼來來回回改了很多次最終還是看了書本上的範例一一地找出問題點。而最有問題的地方是在while跟for迴圈兩個設計的問題,導致程式碼一直跑不出來。希望明天一切順利囉,加油!


上一篇
Day 23 串列
下一篇
Day 25 書籍借還系統專題製作
系列文
C++探險家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言